#ifndef __THREADOBJECT_H__
#define __THREADOBJECT_H__

#include <atomic>
#include <condition_variable>
#include <mutex>
#include <thread>
#include "AtomicQueue.h"
#include "HThreadObject.h"
#include "Task.h"

HTHREADPOOL_NAMESPACE_BEGIN

    enum class ThreadState
    {
        //当线程对象被创建但还没有启动时，线程处于新建状态。
        kNew = 0,  // 新建状态

        //            当线程被创建并调用了 start()方法后，线程进入就绪状态。
        //            在就绪状态下，线程已经准备好运行，但可能还未被调度为运行状态
        kRunnable = 1,  // 就绪状态 start

        //            线程调度器选择了就绪状态的线程，并开始执行其 run()
        //            方法时，线程进入运行状态。在这个状态下，线程正在执行任务。
        kRunning = 2,  // 运行状态 run

        //            线程可能因为某些条件而进入等待状态，等待其他线程的通知或特定条件的满足。在等待状态下，线程会等待直到接收到通知或者等待时间结束。
        kWaiting = 3,  // 等待状态

        //            线程在执行过程中可能因为某些原因被暂停，比如等待某个资源的释放或者输入/输出操作。
        //            当线程处于阻塞状态时，它暂时停止执行，直到条件满足，然后重新进入就绪状态。
        kBlocked = 4,  // 阻塞状态

        // 和等待状态类似，不过线程在等待一段特定的时间后会自动恢复到就绪状态。
        kTimedWaiting = 5,  //超时等待状态（Timed Waiting）
                            //            kStop         = 6,

        //            线程执行完任务或者因异常退出后，进入终止状态。在这个状态下，线程生命周期结束，不再处于活动状态。
        kTerminated = 6,  //终止状态（Terminated）
    };

    enum class ThreadType
    {
        //核心线程 在程序启动时创建的线程，它们执行着程序的基本任务
        kCore = 0,

        //空闲线程在需要执行任务时可以被重复利用，避免了频繁创建线程的开销。它们可以用于执行短期、小规模或临时性的任务，同时在完成任务后会返回线程池以供以后再次使用。这种机制在需要处理大量任务但每个任务消耗资源不多的情况下非常有用。
        kIdle = 1,

        //守护线程则是在后台运行的线程，主要用于支持和辅助核心线程的工作。
        //当所有的核心线程结束运行时，即使守护线程仍在运行，它们也会被强制结束。
        //通常情况下，守护线程用于执行一些辅助性质的任务，比如垃圾回收等。
        kDaemon = 2,
    };

    //为了后续扩展
    class ThreadObject : public HThreadObject
    {
    public:
        ThreadObject(ThreadType type);
        virtual ~ThreadObject();
        // 禁止拷贝和赋值
        ThreadObject(const ThreadObject&) = delete;
        ThreadObject& operator=(const ThreadObject&) = delete;
        ThreadObject(ThreadObject&&) noexcept;
        ThreadObject& operator=(ThreadObject&&) noexcept;
        ThreadState   state() const;     // 退出线程执行
        ThreadType    type();            // 退出线程执行
        virtual void  start() override;  // 启动线程执行
        virtual void  stop() override;   // 停止线程执行
        void          join();
        bool          isQuit();

    protected:
        // 线程运行函数，由子类重写以定义具体任务
        virtual void run() = 0;  // 纯虚函数，执行任务体
        void  quit();   // 退出线程执行

    protected:
        ThreadType               m_type;    // 线程类型
        std::atomic<ThreadState> m_state;   // 原子操作线程状态
        std::mutex               m_mutex;   // 互斥锁
        std::condition_variable  m_cv;      // 条件变量
        std::thread              m_thread;  // 线程实体
    };

HTHREADPOOL_NAMESPACE_END

#endif
